package com.siecom.constconfig;

import java.util.HashMap;
import java.util.Map;

public class ConstTags {


    public static Map<String,String> parseTLVTags(String inData){
        Map<String,String> map = new HashMap<>();
        if (!inData.startsWith("70") )
            return map;
//        System.out.println("去掉70前：" + inData);
        inData = inData.substring(2);
//        System.out.println("去掉70后：" + inData);
        int len = Integer.parseInt(inData.substring(0,2),16); //总长度
//        System.out.println("总长度 len = " + len);
        if (inData.startsWith("81")){ // 81开头 81不是长度
            len = Integer.parseInt(inData.substring(2,4),16); // 数据长度
//            System.out.println("去掉81前：" + inData);
            inData = inData.substring(2);
//            System.out.println("去掉81后：" + inData);
        }
        if (len * 2 != inData.length() - 6){  // 数据和长度不匹配 不去解析
            return map;
        }
        inData = inData.substring(2); // 去掉长度前面两个字符
        //10570E6222521316938764D2603206639F9000
        while (inData.length() > 5){
            String tagAB = inData.substring(0,2); // 去遍历看是不是标签数据
//            System.out.println("tagAB == " + tagAB); // 57标签

            boolean isContain = isTag(tagAB);
            if (isContain){
                //特殊处理 81   如果标签后面是81并且不是长度 直接截取掉 数据长度在81后面
                if(inData.substring(2,4).equals("81") ){
                    inData = inData.substring(4);
                }else {
                    inData = inData.substring(2);
                }
                //1057 0E 6222521316938764D2603206639F9000
                int tLen = Integer.parseInt(inData.substring(0,2),16);
                String value = inData.substring(2,2 + tLen*2);
//                System.out.println("value == " + value);
                map.put(tagAB,value);
                inData = inData.substring(tLen*2 + 2);
//                System.out.println("截取后：" + inData);
            }else { //四位TAG的情况
                tagAB = inData.substring(0,4);
//                System.out.println("tagxxxx = " + tagAB);
                if (isTag(tagAB)){

                    //特殊处理 81   如果标签后面是81并且不是长度 直接截取掉 数据长度在81后面
                    if(inData.substring(4,6).equals("81") ){
                        inData = inData.substring(6);
                    }else {
                        inData = inData.substring(4);
                    }
                    //105F20 0E 6222521316938764D2603206639F9000
                    int tLen = Integer.parseInt(inData.substring(0,2),16);
                    String value = inData.substring(2,2 + tLen * 2);
//                    System.out.println("value == " + value);
                    map.put(tagAB,value);
                    inData = inData.substring(tLen*2 + 2);
//                    System.out.println("截取后：" + inData);
                }
            }

        }

        return map;
    }


    public static boolean isTag(String tagAB){
        for (String allTag : allTags) {
            if (allTag.equals(tagAB)) {
                return true;
            }
        }
        return false;
    }

    public static String [] allTags = new String[]{
            "4F", // 应用标识符(AID)  A000000333010101  注册应用提供商标识（RID）和专用标识符扩展：A000000333010101A000000333确定UICS注册应用提供商(所有的卡片都一样)，010101表明UICS借记应用
            "50", //应用标签	ans	 	50424F43204445424954	终端显示给消费者一个可选应用列表的时候应用的名称
            "57", // 57	磁条2等效数据	var.	最大19	623888888888888888D23022201542600010
            "5A", //应用主帐户(PAN)	cn	最大10	623888888888888888	等同磁条中持卡人姓名。如果持卡人姓名小于等于26字节，则完整的持卡人姓名应当存放在该标签下
            "5F20",// 持卡人姓名	ans	 	79616E78696E382E636F6D	如果持卡人姓名大于26字节，则完整的持卡人姓名应当存放在该标签下
            "5F24",// 应用失效日期	n	3	230203	持卡人证件号
            "5F25",//应用生效日期	n	3	150203	表明持卡人证件类型
            "5F28",//发卡行国家代码	 	 	0156	[C]如果有应用用途控制,按GB/T2659指出发卡行的国家
            "5F2A",//交易货币代码	 	 	0156	按GB/T12406-1996规定的交易货币代码
            "5F2D",//首选语言	an	2	7A68	当终端支持多种语言时，终端根据发卡行首选语言显示终端信息。
            "5F30",// 服务码	n	2	0220
            "5F34",// 应用主帐户序列号	n	 	01	按GB/T12406-1996规定的从交易金额右起的隐含小数点位置用来表示卡片中使用同一个账号的不同应用
            "5F36",// 交易货币指数	 	 	 	按GB/T12406-1996规定的从交易金额右起的隐含小数点位置
            "5F50",//
            "5F57",//
            "6F",  //
            "72",  //
            "73",  //
            "77",  //
            "80",  //
            "81",  //
            "82",  //
            "83",  //
            "84",  //
            "86",  //
            "87",  //
            "88",  //
            "8A",  //
            "8C",  //
            "8D",  //
            "8E",  //
            "8F",  //
            "90",  //
            "91",  //
            "92",//
            "93",//
            "94",//
            "95",//
            "97",//
            "98",//
            "99",//
            "9A",//
            "9B",//
            "9C",//
            "9D",//
            "9F01",//
            "9F02",//
            "9F03",//
            "9F04",//
            "9F05",//
            "9F06",//
            "9F07",//
            "9F08",//
            "9F09",//
            "9F0B",//
            "9F0D",//
            "9F0E",//
            "9F0F",//
            "9F10",//
            "9F11",//
            "9F12",//
            "9F13",//
            "9F14",//
            "9F15",//
            "9F16",//
            "9F17",//
            "9F18",//
            "9F1A",//
            "9F1B",//
            "9F1C",//
            "9F1E",//
            "9F1F",//
            "9F21",//
            "9F22",//
            "9F23",//
            "9F26",//
            "9F27",//
            "9F32",//
            "9F33",//
            "9F34",//
            "9F35",//
            "9F36",//
            "9F37",//
            "9F38",//
            "9F3A",//
            "9F3C",//
            "9F3D",//
            "9F40",//
            "9F41",//
            "9F42",//
            "9F44",//
            "9F45",//
            "9F46",//
            "9F47",//
            "9F48",//
            "9F49",//
            "9F4A",//
            "9F4B",//
            "9F4C",//
            "9F4D",//
            "9F4E",//
            "9F4F",//
            "9F51",//
            "9F52",//
            "9F53",//
            "9F54",//
            "9F56",//
            "9F57",//
            "9F58",//
            "9F59",//
            "9F5A",//
            "9F5C",//
            "9F61",//
            "9F62",//
            "9F63",//
            "9F66",//
            "9F68",//
            "9F6C",//
            "9F6D",//
            "9F72",//
            "9F73",//
            "9F74",//
            "9F75",//
            "9F76",//
            "9F77",//
            "9F78",//
            "9F79",//
            "9F7A",//
            "A5",  //
            "BF0C",//
            "DF4D",//
            "DF4F",//
            "9F63",//
            "DF60",//
            "DF61",//
            "DF62",//
            "DF63",//
            "DF69",//

    };
}
